/*
 * StrahlentherapieDetectorConstruction.hh
 *
 *  Created on: Oct 1, 2010
 *      Author: pwagner
 */

#ifndef StrahlentherapieDetectorConstruction_h
#define StrahlentherapieDetectorConstruction_h 1

#include "G4VUserDetectorConstruction.hh"

class G4Material;
class G4LogicalVolume;
class G4VPhysicalVolume;
class G4VSensitiveDetector;

/**
 * Klasse fuer die Detektor-Konstruktion.
 */
class StrahlentherapieDetectorConstruction : public G4VUserDetectorConstruction
{
  public:
    StrahlentherapieDetectorConstruction();
    ~StrahlentherapieDetectorConstruction();

    /**
     * Wird automatisch von Geant aufgerufen sobald die Konstruktion gestartet werden soll.
     * Ruft alle Methoden zur Konstruktionen von Material, logischen und physischen Volumen auf.
     *
     * @return physische Welt-Volumen
     */
    G4VPhysicalVolume* Construct();

    /**
     * Gibt das oberste PhysicalVolume (worldVolume) zurueck.
     * Achtung: Keine Fehlerbehebung! Falls Construct() noch nicht aufgerufen
     * wurde und somit das worldVolume noch nicht initialisiert wird, wird
     * dies nicht bemerkt.
     *
     * @ return physische Welt-Volumen
     */
    G4VPhysicalVolume* GetPhysicalVolume();

  private:
    /**
     * Reltive Positionierung festlegen.
     */
    void SetRelativePositioning();

    /**
     * Erstellt Materialien und logische Volumina.
     */
    void ConstructMaterialsAndLogicals();

    /**
     * Setzt Attribute wie Farbe fuer Volumina.
     */
    void SetVisualAttributes();

    /**
     * Erstellen der physischen Volumina.
     */
    void ConstructPhysicalVolumes();

    /**
     * Zuweisen der sensitiven Detektoren.
     */
    void SetSensitiveDetectors();
    
    /**
     * weist dem Logischen Volumen root und rekursiv allen Tochtervolumina den Sensitiven Detektor sd zu
     */
    void SetSensitiveDetectorToLogVolAndDaughters(G4LogicalVolume * root, G4VSensitiveDetector * sd);

    // Materials
    G4Material* air;
    G4Material* skin;
    G4Material* muscle;
    G4Material* bone;
    G4Material* brain;
    G4Material* water;
    G4Material* bone_cortical;
    G4Material* lead;
    G4Material* tumor;
    G4Material* neutron_star;

    // Positioning
    G4double skinPosition_x;
    G4double skinPosition_y;
    G4double skinPosition_z;
    G4double neckPosition_x;
    G4double neckPosition_y;
    G4double neckPosition_z;
    G4double afterbrainPosition_x;
    G4double afterbrainPosition_y;
    G4double afterbrainPosition_z;
   	G4double eyePosition_dx;
   	G4double eyePosition_y;
   	G4double eyePosition_z;
   	G4double tumorPosition_x;
   	G4double tumorPosition_y;
   	G4double tumorPosition_z;
   	G4double headAbsolutePosition_x;
   	G4double headAbsolutePosition_y;
   	G4double headAbsolutePosition_z;
   	G4double lead_plate_x;
  	G4double lead_plate_y;
   	G4double lead_plate_z;

    // Logical volumes
    G4LogicalVolume* worldVolume_log;
    G4LogicalVolume* lead_plate_log;
    G4LogicalVolume* head_log;
    G4LogicalVolume* skin_head_log;
    G4LogicalVolume* skin_neck_log;
    G4LogicalVolume* skin_log;
    G4LogicalVolume* bone_head_log;
    G4LogicalVolume* brain_head_log;
    G4LogicalVolume* muscle_neck_log;
    G4LogicalVolume* afterbrain_log;
    G4LogicalVolume* eye_left_log;
    G4LogicalVolume* eye_right_log;
    G4LogicalVolume* tumor_log;

    G4LogicalVolume* detector_log;

    // Physical volumes
    G4VPhysicalVolume* worldVolume_phys;
    G4VPhysicalVolume* lead_plate_phys;
    G4VPhysicalVolume* head_phys;
    G4VPhysicalVolume* skin_phys;
    G4VPhysicalVolume* bone_head_phys;
    G4VPhysicalVolume* brain_head_phys;
    G4VPhysicalVolume* muscle_neck_phys;
    G4VPhysicalVolume* afterbrain_phys;
    G4VPhysicalVolume* eye_left_phys;
    G4VPhysicalVolume* eye_right_phys;
    G4VPhysicalVolume* tumor_phys;

    G4VPhysicalVolume* detector_phys;
};
#endif
